/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import modelo.tipos.TipoVariavel;
import static modelo.tipos.TipoVariavel.CHAR;
import static modelo.tipos.TipoVariavel.INTEIRO;
import static modelo.tipos.TipoVariavel.REAL;
import static modelo.tipos.TipoVariavel.STRING;

/**
 *
 * @author DEP
 */
public class Procedimento implements TipoIdentificador {

    private String nome,escopo;
    private Map<String, TipoVariavel> parametros;
    private int linha;

    @Override
    public String getEscopo() {
        return escopo;
    }

    public void setEscopo(String escopo) {
        this.escopo = escopo;
    }

    @Override
    public int getLinha() {
        return linha;
    }

    public void setLinha(int linha) {
        this.linha = linha;
    }

    public Map<String, TipoVariavel> getParametros() {
        return parametros;
    }

    public void setParametros(Map<String, TipoVariavel> parametros) {
        this.parametros = parametros;
    }
    

    public Procedimento() {
        parametros = new LinkedHashMap<>();
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public boolean foiDeclarada(String chave) {
        return parametros.keySet().contains(chave);
    }

    private boolean foramDeclaradas(Set<Token> s) {
        for (Token t : s) {
            if (foiDeclarada(t.getToken())) {
                return true;
            }
        }
        return false;
    }

    public List<ErroSemantico> addParametros(Set<Token> s, TipoVariavel t) throws IndentificadorJaDeclarado, ErroSemantico {
        List<ErroSemantico> erros = new ArrayList<>();
        if (foramDeclaradas(s)) {
            for (Token token : s) {
                if (foiDeclarada(token.getToken())) {
                    erros.add(new IndentificadorJaDeclarado(token.getToken(), token.getLinha(), new Parametro()));
                }
            }
            return erros;
        } else {
            criarTodosParametros(s, t);
        }
        return null;
    }

    public void criarTodosParametros(Set<Token> tokens, TipoVariavel t) throws ErroSemantico {
        try {
            for (Token identificador : tokens) {
                criarParametro(identificador.getToken(), t);
            }
        } catch (NullPointerException ex) {
            throw new ErroSemantico() {
                public String errosToString() {
                    return "Erro interno.";
                }
            };
        }
    }

    public void criarParametro(String chave, TipoVariavel tipo) {
        switch (tipo) {
            case STRING:
                parametros.put(chave, tipo);
                break;
            case INTEIRO:
                parametros.put(chave, tipo);
                break;
            case REAL:
                parametros.put(chave, tipo);
                break;
            case CHAR:
                parametros.put(chave, tipo);
        }
    }

    @Override
    public TipoVariavel getTipo() {
        return null;
    }
}

